Atividade: Soma de variáveis aleatórias


Aula 17

Preparo Prévio:

  1. Seção 5.1 – págs 137 a 140: aborda como fazer uma distribuição de probabilidade conjunta entre duas variáveis aleatórias X e Y e define função de probabilidade conjunta.
  2. Seção 5.2 – págs 146 a 149; págs 156 e 157 (Exemplo 5.12) e págs 158 a 162 (Exemplo 5.13): aborda propriedades de esperança e variância em soma de variáveis aleatórias (X+Y).

Hoje:

  1. Descrever as propriedades de distribuição conjunta entre duas variáveis aleatórias discretas.
  2. Compreender correlação entre variáveis aleatórias.
  3. Descrever as propriedades de esperança e variância para soma de variáveis aleatórias (discretas e contínuas).

Próxima aula:

  1. Leitura prévia necessária: Magalhães e Lima (7ª. Edição): Seção 7.3 (págs 234 a 240).


In [1]:
%matplotlib inline

import os
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from scipy import stats
from scipy.stats import norm

Exercício 1 - Exemplo 3 da Aula 17

Num determinado momento em um certo país, a taxa de juros ($X$) pode variar 0,25 pontos percentuais (pp), para cima ou para baixo, ou manter-se constante. Já a taxa de câmbio ($Y$) pode variar para mais ou para menos em 1 pp, ou manter-se constante. A tabela seguinte reflete as distribuições marginais e conjunta dessas duas taxas representadas, aqui, por $X$ e $Y$.

Um investidor aplica a mesma quantia num fundo que acompanha a variação da taxa de juros ($X$) e num fundo que acompanha a variação cambial ($Y$). Ao final do dia ele resgatará seu investimento.

  1. Encontre a $E(X)$, $Var(X)$, $E(Y)$, $Var(Y)$, $Cov(X,Y)$ e $Corr(X,Y)$.
  2. Construa a distribuição de probabilidades do ganho (em variação %) desse investidor, ou seja, encontre todos os valores de $G=0.5*X+0.5*Y$, sendo $G$ o ganho do investidor aplicando metade do dinheiro em $X$ e metade do dinheiro em $Y$.
  3. Calcule esperança e variância de $G$ utilizando a distribuição de probabilidade, ou seja, $E(G)$ e $Var(G)$.
  4. Calcule esperança e variância de $G$ utilizando propriedades de esperança e variância da soma de variáveis aleatórias.

In [2]:
#Valores da tabela
y=[-1,0,1] #colunas
x=[-0.25,0,0.25] #linhas
probXY=[[[] for i in range(3)] for i in range(3)]
pxy=[0.05,0.07,0.26,0.075,0.21,0.12,0.125,0.07,0.02]
k=0
for i in range(3):
    for j in range(3):
        probXY[i][j]=pxy[k]
        k+=1
print(probXY)


[[0.05, 0.07, 0.26], [0.075, 0.21, 0.12], [0.125, 0.07, 0.02]]

In [3]:
#item 1 
#Distribuição de X
probX=[0,0,0]
for i in range(3):
    for j in range(3):
        probX[i]+=probXY[i][j]
for i in range(3):
    print("Probabilidade de X=",x[i]," é igual a ", probX[i])

espX=0
varX=0
for i in range(3):
    espX+=x[i]*probX[i]
for i in range(3):
    varX+=(x[i]-espX)**2*probX[i]
print("Esperança de X=",espX)
print("Variância de X=",varX)


Probabilidade de X= -0.25  é igual a  0.38
Probabilidade de X= 0  é igual a  0.40499999999999997
Probabilidade de X= 0.25  é igual a  0.215
Esperança de X= -0.04125
Variância de X= 0.0354859375

In [4]:
#item 1 
#Distribuição de Y
probY=[0,0,0]
for i in range(3):
    for j in range(3):
        probY[j]+=probXY[i][j]
for i in range(3):
    print("Probabilidade de Y=",y[i]," é igual a ", probY[i])

espY=0
varY=0
for i in range(3):
    espY+=y[i]*probY[i]
for i in range(3):
    varY+=(y[i]-espY)**2*probY[i]
print("Esperança de Y=",espY)
print("Variância de Y=",varY)


Probabilidade de Y= -1  é igual a  0.25
Probabilidade de Y= 0  é igual a  0.35000000000000003
Probabilidade de Y= 1  é igual a  0.4
Esperança de Y= 0.15000000000000002
Variância de Y= 0.6275

In [5]:
#item 1
#Covariância e Correlação
cov=0
for i in range(3):
    for j in range(3):
        cov+=(x[i]-espX)*(y[j]-espY)*probXY[i][j]

corr=cov/(varX*varY)**(0.5)
print("Covariância entre X e Y=", cov)
print("Correlação entre X e Y=", corr)


Covariância entre X e Y= -0.07256249999999999
Correlação entre X e Y= -0.4862697238590869

In [6]:
#item 2
#Distribuição do G=0.5*X +0.5*Y
g=[]
probG=[]
for i in range(3):
    for j in range(3):
        a = 0.5*x[i]+0.5*y[j],
        if a in g:
            probG[g.index(a)] += probX[i][j]
        else:
            g.append(a)         
            probG.append(probXY[i][j])

for i in range(len(g)):
    print("Probabilidade de G=",g[i]," é igual a ", probG[i])


Probabilidade de G= (-0.625,)  é igual a  0.05
Probabilidade de G= (-0.125,)  é igual a  0.07
Probabilidade de G= (0.375,)  é igual a  0.26
Probabilidade de G= (-0.5,)  é igual a  0.075
Probabilidade de G= (0.0,)  é igual a  0.21
Probabilidade de G= (0.5,)  é igual a  0.12
Probabilidade de G= (-0.375,)  é igual a  0.125
Probabilidade de G= (0.125,)  é igual a  0.07
Probabilidade de G= (0.625,)  é igual a  0.02

In [7]:
#item 3
#Esperança e variância de G
espG=0
varG=0
for i in range(len(g)):
    espG+=g[i]*probG[i]
for i in range(len(g)):
    varG+=(g[i]-espG)**2*probG[i]

print("Esperança e variância de G usando distribuição de probabilidade de G:")
print("Esperança de G=",espG)
print("Variância de G=",varG)


---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-7-a20a1edbecb8> in <module>()
      4 varG=0
      5 for i in range(len(g)):
----> 6     espG+=g[i]*probG[i]
      7 for i in range(len(g)):
      8     varG+=(g[i]-espG)**2*probG[i]

TypeError: can't multiply sequence by non-int of type 'float'

In [8]:
#item 4
#Esperança e variância de G usando propriedades de soma de variáveis aleatórias

#G=0.5X + 0.5Y
#G=0.5*(X+Y)

espGp = 0.5*(espX+espY)
varGp = 0.5**2*(varX+varY+2*cov)

print("Esperança e variância de G usando propriedades:")
print("Esperança de G=",espGp)
print("Variância de G=",varGp)


Esperança e variância de G usando propriedades:
Esperança de G= 0.05437500000000001
Variância de G= 0.129465234375

Exercício 2 - Soma de normais correlacionadas

Um pacote com mil peças de resistor de carbono 1/8w tem o preço distribuído como uma normal com média 21 reais e desvio padrão de 2 reais, ou seja, $X$~$N(21;4)$.

Já jumpers/fios macho-fêmea com 40 unidades de 20 cm tem o preço distribuído como uma normal com média 18,90 reais e desvio padrão de 1,50 reais, ou seja, $Y$~$N(18,90;2,25)$.

Assuma que a correlação entre esses dois preços seja de 0,85.

  1. Simule $n=100$, $n=1.000$ e $n=10.000$ de cada variáveis aleatória respeitando a correlação entre elas. Para tanto, consulte o comando np.random.multivariate_normal(mean, cov, n).
  2. Se você vai passear na Santa Efigênia para comprar um pacote de cada um, calcule a esperança e a variância do gasto $G=X+Y$ com a compra de uma pacotinho de resistores e um jumper nas especificações acima descritos.
  3. Calcule esperança e variância de $G$ utilizando propriedades de esperança e variância da soma de variáveis aleatórias.
  4. Construa a distribuição do gasto e verifique se o gasto se assemelha a distribuição normal.
  5. Repita assumindo correlação igual a zero entre X e Y.

In [9]:
#Informações do enunciado
muX = 21
varX = 4
muY = 18.90
varY = 2.25
corXY = 0.95
covXY = corXY*(varX*varY)**(0.5)
mean = [muX, muY]
cov = [[varX, covXY], [covXY, varY]]  # diagonal covariance

In [31]:
n=100
x, y = np.random.multivariate_normal(mean, cov, n).T
print("Matriz de covariâncias a partir dos n valores correlacionados:")
print(np.cov(x,y))

gasto = []
for i in range(len(x)):
    gasto.append(x[i]+y[i])
    
data = pd.Series(gasto)       
x2 = np.arange(20,80,1)
y2 = norm.pdf(x2, muX + muY, (varX + varY + 2*covXY)**0.5)
plt.plot(x2,y2, lw = 3, alpha = 0.7)
hist2 = data.plot(kind = 'hist',bins = 12, normed = True)
plt.show()
print('Média real:',data.mean())
print('Variância real:',data.var())


Matriz de covariâncias a partir dos n valores correlacionados:
[[ 4.3623335  -0.0265359 ]
 [-0.0265359   2.34945663]]
Média real: 39.42666014329276
Variância real: 6.658718319078414

In [23]:
n=1000
x, y = np.random.multivariate_normal(mean, cov, n).T
print("Matriz de covariâncias a partir dos n valores correlacionados:")
print(np.cov(x,y))

gasto = []
for i in range(len(x)):
    gasto.append(x[i]+y[i])
    
data = pd.Series(gasto)    
x2 = np.arange(20,80,1)
y2 = norm.pdf(x2, muX + muY, (varX + varY + 2*covXY)**0.5)
plt.plot(x2,y2, lw = 3, alpha = 0.7)
hist2 = data.plot(kind = 'hist',bins = 12, normed = True)
plt.show()
print('Média real:',data.mean())
print('Variância real:',data.var())


Matriz de covariâncias a partir dos n valores correlacionados:
[[ 4.13873224 -0.03845008]
 [-0.03845008  2.23261717]]
Média real: 39.8136346007625
Variância real: 6.294449239453129

In [30]:
n=10000
x, y = np.random.multivariate_normal(mean, cov, n).T
print("Matriz de covariâncias a partir dos n valores correlacionados:")
print(np.cov(x,y))

gasto = []
for i in range(len(x)):
    gasto.append(x[i]+y[i])
    
data = pd.Series(gasto)       
x2 = np.arange(20,80,1)
y2 = norm.pdf(x2, muX + muY, (varX + varY + 2*covXY)**0.5)
plt.plot(x2,y2, lw = 3, alpha = 0.7)
hist2 = data.plot(kind = 'hist',bins = 12, normed = True)
plt.show()
print('Média real:',data.mean())
print('Variância real:',data.var())


Matriz de covariâncias a partir dos n valores correlacionados:
[[ 4.00093985  0.0199875 ]
 [ 0.0199875   2.27066854]]
Média real: 39.888415582122235
Variância real: 6.311583385012684

item 5


In [25]:
muX = 21
varX = 4
muY = 18.90
varY = 2.25
corXY = 0
covXY = corXY*(varX*varY)**(0.5)
mean = [muX, muY]
cov = [[varX, covXY], [covXY, varY]]

In [26]:
n=100
x, y = np.random.multivariate_normal(mean, cov, n).T
print("Matriz de covariâncias a partir dos n valores correlacionados:")
print(np.cov(x,y))

gasto = []
for i in range(len(x)):
    gasto.append(x[i]+y[i])
    
data = pd.Series(gasto)       
x2 = np.arange(20,80,1)
y2 = norm.pdf(x2, muX + muY, (varX + varY + 2*covXY)**0.5)
plt.plot(x2,y2,lw = 3, alpha = 0.7)
hist2 = data.plot(kind = 'hist',bins = 12, normed = True)
plt.show()
print('Média real:',data.mean())
print('Variância real:',data.var())


Matriz de covariâncias a partir dos n valores correlacionados:
[[ 4.41722263 -0.08169681]
 [-0.08169681  2.34943895]]
Média real: 39.895428485745676
Variância real: 6.603267962012929

In [27]:
n=1000
x, y = np.random.multivariate_normal(mean, cov, n).T
print("Matriz de covariâncias a partir dos n valores correlacionados:")
print(np.cov(x,y))

gasto = []
for i in range(len(x)):
    gasto.append(x[i]+y[i])
    
data = pd.Series(gasto)    
#temp    
x2 = np.arange(20,80,1)
y2 = norm.pdf(x2, muX + muY, (varX + varY + 2*covXY)**0.5)
plt.plot(x2,y2,lw = 3, alpha = 0.7)
hist2 = data.plot(kind = 'hist',bins = 12, normed = True)
plt.show()
print('Média real:',data.mean())
print('Variância real:',data.var())


Matriz de covariâncias a partir dos n valores correlacionados:
[[ 3.58411805  0.1711159 ]
 [ 0.1711159   2.35989562]]
Média real: 40.080690355903826
Variância real: 6.286245465712609

In [28]:
n=10000
x, y = np.random.multivariate_normal(mean, cov, n).T
print("Matriz de covariâncias a partir dos n valores correlacionados:")
print(np.cov(x,y))

gasto = []
for i in range(len(x)):
    gasto.append(x[i]+y[i])
    
data = pd.Series(gasto)       
x2 = np.arange(20,80,1)
y2 = norm.pdf(x2, muX + muY, (varX + varY + 2*covXY)**0.5)
plt.plot(x2,y2,lw = 3, alpha = 0.7)
hist2 = data.plot(kind = 'hist',bins = 12, normed = True)
plt.show()
print('Média real:',data.mean())
print('Variância real:',data.var())


Matriz de covariâncias a partir dos n valores correlacionados:
[[ 4.09344165  0.03353422]
 [ 0.03353422  2.25744908]]
Média real: 39.898043981764715
Variância real: 6.417959160783026